
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>MySQL性能调优与8.0新特性 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>MySQL性能调优与8.0新特性 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">在使用 `EXPLAIN` 分析查询时，`type` 字段从 'ALL' 变为 'index' 通常意味着什么优化？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">这表示查询的执行方式从 'ALL'（全表扫描）优化为了 'index'（索引扫描），意味着查询开始利用索引来查找数据，从而避免了扫描整张表，提高了查询效率。</div>
          </div>
          <div class="card-source">来源: 2.2 执行计划解读（EXPLAIN解密）</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">MySQL 8.0 的通用表表达式 (CTE) 有什么典型应用场景？请根据文档举例说明。</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">通用表表达式（CTE）的一个典型应用是进行递归查询。例如，文档中展示了使用 `WITH RECURSIVE` 语句来查询具有层级关系的数据，如一个公司的组织架构树。</div>
          </div>
          <div class="card-source">来源: 3.1 通用表表达式（CTE）</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">MySQL 8.0 引入的“不可见索引”（Invisible Index）主要解决了什么问题？它的工作流程是怎样的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">不可见索引主要用于“安全调优”，它允许在不影响现有生产环境查询计划的情况下测试新索引的性能。其工作流程是：1. 将新索引创建为 `INVISIBLE`；2. 在测试会话中使用 `USE INDEX` 强制查询使用该索引来验证其效果；3. 确认索引有效后，再将其设置为 `VISIBLE`，使其对所有查询生效。</div>
          </div>
          <div class="card-source">来源: 3.3 不可见索引（安全调优）</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">针对深度分页查询（如 `LIMIT 100000, 20`），文档中提出的优化方案核心思想是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">优化方案的核心思想是避免使用大的 `LIMIT` 偏移量，转而使用基于索引的“书签式”查询。具体做法是，利用上一页最后一条记录的`create_time`作为查询条件（例如 `WHERE create_time < '上页最后时间'`），并结合排序和 `LIMIT` 来获取下一页数据，这样可以高效地利用索引定位数据。</div>
          </div>
          <div class="card-source">来源: 4.1 案例一：订单分页优化</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">当系统在高并发下出现大量 `lock wait timeout` 错误时，文档提供了什么样的组合解决方案？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">文档提供的解决方案结合了数据库设置和应用层逻辑：1. 在数据库层面，可以设置一个较短的 `innodb_lock_wait_timeout` (例如3秒)。2. 在应用层，需要配合实现重试机制，当捕获到锁超时异常时，进行短暂休眠后重试操作。</div>
          </div>
          <div class="card-source">来源: 4.2 案例二：用户登录锁竞争</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">针对日志表的大量数据存储和查询，MySQL 8.0 提供了哪些优化特性？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">文档中提到了三种优化特性：1. 使用 `JSON` 类型存储结构灵活的日志数据；2. 使用“生成列”（Generated Column）从JSON数据中提取常用字段（如`log_level`）并为其创建索引；3. 使用表分区（如按年份 `PARTITION BY RANGE`）来管理和归档海量数据，提高查询和维护效率。</div>
          </div>
          <div class="card-source">来源: 4.3 案例三：日志表性能优化</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">文档中提到的MySQL“性能分析三板斧”具体是哪三种方法？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">性能分析三板斧指的是三种核心的性能分析手段：1. 开启并分析慢查询日志（Slow Query Log）；2. 利用性能模式（Performance Schema），特别是通过 `sys.statement_analysis` 视图来定位高成本SQL；3. 使用 `SHOW ENGINE INNODB STATUS` 命令来监控InnoDB存储引擎的内部状态。</div>
          </div>
          <div class="card-source">来源: 5.3 性能分析三板斧</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">在MySQL配置中，将 `innodb_flush_log_at_trx_commit` 参数设置为 `2` 是为了达到什么目的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">将其设置为 `2` 是为了在数据安全性和写入性能之间取得平衡。相比于每次事务提交都刷写日志到磁盘（值为1），设置为2意味着日志仅写入操作系统缓存并每秒刷盘一次，这能显著提升性能，但代价是在数据库或操作系统崩溃时可能丢失最后一秒的事务数据。</div>
          </div>
          <div class="card-source">来源: 5.2 配置参数黄金组合</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">MySQL 8.0 引入的原子DDL（Atomic DDL）特性有什么好处？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">原子DDL（Atomic DDL）的主要好处是保证了数据定义语言（DDL）操作的原子性。这意味着像 `ALTER TABLE` 这样的操作要么完全成功，要么在失败时完全回滚，不会出现只修改了部分元数据而导致数据字典不一致的中间状态，从而使大表结构变更等操作更加安全可靠。</div>
          </div>
          <div class="card-source">来源: 六、未来已来：8.0新特性演进方向</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
